package com.shujia.sql

import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

object Demo02SourceAPI {
  def main(args: Array[String]): Unit = {
    // SparkSQL常用的Source：csv、json、orc、parquet、jdbc
    val spark: SparkSession = SparkSession
      .builder()
      .appName("Demo02SourceAPI")
      .master("local")
      .getOrCreate()

    // 1、csv
    val csvDF: DataFrame = spark
      .read
      .format("csv")
      .option("sep", ",")
      .schema("id String,name String,age Int,gender String,clazz String")
      .load("spark/data/stu/students.txt")
    //    csvDF.show()
    // 查看结构
    //    csvDF.printSchema()

    // 保存数据
    //    csvDF.write.format("csv").option("sep","|").mode(SaveMode.Overwrite).save("spark/data/students/csv")
    //    csvDF.write.format("json").mode(SaveMode.Overwrite).save("spark/data/students/json")
    //    csvDF.write.format("parquet").mode(SaveMode.Overwrite).save("spark/data/students/parquet")
    //    csvDF.write.format("orc").mode(SaveMode.Overwrite).save("spark/data/students/orc")

    // 2、json
    val jsonDF: DataFrame = spark
      .read
      .format("json")
      // json文件自带格式 所以不需要指定schema
      .load("spark/data/students/json/")
    //    jsonDF.show()

    // 3、ORC：通常使用snappy压缩方式进行压缩，有着很高的压缩比，可以节省空间
    // 列式存储格式，提高计算性能
    val orcDF: DataFrame = spark
      .read
      .format("orc")
      // orc文件自带格式 所以不需要指定schema
      .load("spark/data/students/orc/")
    //    orcDF.show()

    // 4、Parquet：同ORC类似，对嵌套数据支持比较友好
    val parquetDF: DataFrame = spark
      .read
      .format("parquet")
      // parquet文件自带格式 所以不需要指定schema
      .load("spark/data/students/parquet/")
    //    parquetDF.show()

    // 5、jdbc
    val jdbcDF: DataFrame = spark
      .read
      .format("jdbc")
      .option("url", "jdbc:mysql://rm-bp1h7v927zia3t8iwho.mysql.rds.aliyuncs.com:3307/stu023")
      .option("dbtable", "student")
      .option("user", "shujia23")
      .option("password", "123456")
      .load()

    // 写入MySQL
    jdbcDF
      .select("id", "name", "age", "gender", "clazz")
      .write
      .format("jdbc")
      .option("url", "jdbc:mysql://rm-bp1h7v927zia3t8iwho.mysql.rds.aliyuncs.com:3307/stu023")
      .option("dbtable", "student_jdbc")
      .option("user", "shujia23")
      .option("password", "123456")
      .option("truncate", "true")
      // 直接使用Overwrite写入MySQL会导致表结构发生变化
      // Overwrite会先将table Drop掉然后再按照SparkSQL的方式进行Create
      // 如果需要保留表结构 需要设置truncate参数为true
      .mode(SaveMode.Overwrite)
      .save()
  }

}
